# 模块Student_manager.py模块类定义类StudentManager
# 该类是关于学员对象的增删改查等操作，自定义功能函数
from Pro.student_system.student import Student


class StudentManager:
    def __init__(self):
        # 学员列表，保存学员对象（列表中的元素是student对象）
        self.stu_list = []

    # 自定义程序入口，1）功能菜单 2）用户输入 3）进入不同功能
    def run(self):
        # 0）加载文件中数据
        self.load_data()
        while True:

            # 1）调用功能菜单
            self.menu()
            # 2）用户输入
            num = input('请输入您需要的功能序号：')
            # 3)根据用户输入执行不同功能
            if num == '1':
                self.add_stu()
            elif num == '2':
                self.del_stu()
            elif num == '3':
                self.modify_stu()
            elif num == '4':
                self.search_stu()
            elif num == '5':
                self.show_stu()
            elif num == '6':
                self.save_stu()
            elif num == '7':
                break
            else:
                print('输入有误')

    def menu(self):
        print('-' * 20)
        print('1.添加学员')
        print('2.删除学员')
        print('3.修改学员')
        print('4.查询学员')
        print('5.显示所有学员信息')
        print('6.保存学员')
        print('7.退出')

    def add_stu(self):
        print('----添加----')
        # 1)用户输入学员信息
        name = input('请输入学员姓名：')
        gender = input('请输入学员性别：')
        tel = input('请输入学员电话：')
        # 2)封装信息
        stu = Student(name, gender, tel)
        # 3)将对象添加到学员列表
        self.stu_list.append(stu)

    def del_stu(self):
        pass

    def modify_stu(self):
        pass

    def search_stu(self):
        pass

    def show_stu(self):
        print('----显示所有----')
        # 将学员列表格式化展示
        print('姓名\t性别\t手机号')
        for s in self.stu_list:
            # s是列表中元素，是student对象
            print(f'{s.name}\t{s.gender}\t{s.tel}')

    def save_stu(self):
        print('----保存信息----')
        # 将学员列表重大信息保存到文件
        # 若直接将列表中的元素存入文件。存的是对象地址
        # 需要将列表中的元素转为字典
        with open('data.txt', 'w', encoding='utf-8') as f:
            # 这里的s就是student对象，s.__dict__是对象字典格式数据
            new_data = [s.__dict__ for s in self.stu_list]
            # write()需要转入的参数是str
            f.write(str(new_data))

    # 读取文件中数据，添加学员列表
    def load_data(self):
        # 可能出现异常的代码,文件存在则只读
        try:
            f = open('data.txt', 'r')
        # 出现异常后执行，文件不存在则写
        except:
            f = open('data.txt', 'w')
        # 没有异常要执行
        else:
            data = f.read()
            # 文件中读取的内容是字符串格式，需要转换成字典
            new_data = eval(data)
            # 将其存入学员列表，s为字典，转为对象
            self.stu_list = [Student(s['name'], s['gender'], s['tel']) for s in new_data]
        # 无论有无异常都会执行,关闭
        finally:
            f.close()
